package view.hoidap.noidunghoidap;

import java.sql.Timestamp;

import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import oracle.adf.model.BindingContext;
import oracle.adf.model.bean.DCDataRow;
import oracle.adf.model.binding.DCBindingContainer;
import oracle.adf.model.binding.DCIteratorBinding;
import oracle.adf.view.rich.component.UIXTable;
import oracle.adf.view.rich.component.rich.RichPopup;
import oracle.adf.view.rich.component.rich.input.RichInputDate;
import oracle.adf.view.rich.component.rich.input.RichSelectOneChoice;
import oracle.adf.view.rich.event.DialogEvent;
import oracle.adf.view.rich.event.PopupCanceledEvent;

import oracle.binding.BindingContainer;

import oracle.jbo.Key;
import oracle.jbo.Row;
import oracle.jbo.RowSet;
import oracle.jbo.RowSetIterator;
import oracle.jbo.ViewCriteria;
import oracle.jbo.ViewCriteriaManager;
import oracle.jbo.ViewObject;
import oracle.jbo.server.ViewRowImpl;
import oracle.jbo.uicli.binding.JUCtrlHierNodeBinding;
import oracle.jbo.uicli.binding.JUCtrlRangeBinding;

import oracle.security.idm.testframework.Test;

import org.apache.myfaces.trinidad.component.UIXIterator;
import org.apache.myfaces.trinidad.event.SelectionEvent;
import org.apache.myfaces.trinidad.model.RowKeySet;

import view.common.Utils;

public class noidunghoidapBean {
    private RichPopup popupThemMoi;
    private RichPopup popupDelete;
    private RichPopup popupXemChiTiet;
    private UIXIterator hoidapIterator;
    private String Tieude;
    private RichSelectOneChoice selectChude;
    private String Email;
    private Date NgayGui;
    private Date NgayTraLoi;
    private final String TieudeAttribute = "Tieude";
    private final String ChudeAttribute = "LinhvucId";
    private final String EmailAttribute = "Email";
    private final String NgayguiAttribute = "NgayGui";
    private final String NgaytraloiAttribute = "NgayTraLoi";
    private UIXTable tbl;
    private int pageNumber;
    private static final int RANGE_SIZE = 10;
    private RichInputDate ValueNgaygui = new RichInputDate();
    private RichInputDate ValueNgaytraloi = new RichInputDate();
    private String Ngaytraloimacdinh;
    private Date NewNgaytraloi;

    public noidunghoidapBean() {
        JUCtrlRangeBinding HoidapView = this.getHoiDapView();
        HoidapView.getIteratorBinding().getNavigatableRowIterator().scrollRange(0);

        if (Boolean.FALSE.equals(Utils.getElExpression("#{adfFacesContext.postback}"))) {
            DCIteratorBinding iterHoidapVn =
                Utils.getIteratorBinding("HoidapView1Iterator");
            iterHoidapVn.getViewObject().getViewCriteriaManager().clearViewCriterias();
            iterHoidapVn.executeQuery();
        }
    }

    public BindingContainer getBindings() {
        return BindingContext.getCurrent().getCurrentBindingsEntry();
    }

    public List<SelectItem> getDmchude() {
        List<SelectItem> lstdmchude = new ArrayList<SelectItem>();
        try {
            DCIteratorBinding iterHoidap =
                Utils.getIteratorBinding("HoidapLinhvucView1Iterator");

            for (Row row : iterHoidap.getAllRowsInRange()) {
                lstdmchude.add(new SelectItem(row.getAttribute("Id").toString(),
                                              row.getAttribute("TenVn").toString()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return lstdmchude;
    }

    public void ResetSearchhoidap() {
        try {
            DCIteratorBinding iterHoidapVn =
                Utils.getIteratorBinding("HoidapView1Iterator");
            iterHoidapVn.getViewObject().getViewCriteriaManager().clearViewCriterias();
            iterHoidapVn.executeQuery();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void searchhoidap() {
        try {
            String TieuDeValue = null;
            String ChudeValue = null;
            String EmailValue = null;
            TieuDeValue = getTieude();
            if (TieuDeValue == null) {
                TieuDeValue = "%";
            } else {
                TieuDeValue = "%" + TieuDeValue.toUpperCase() + "%";
            }
            if (selectChude.getValue() != null) {
                ChudeValue = selectChude.getValue().toString();
            }
            EmailValue = getEmail();
            if (EmailValue == null) {
                EmailValue = "%";
            } else {
                EmailValue = "%" + EmailValue.toUpperCase() + "%";
            }

            Date NgayGuiValue = getNgayGui();
            Date NgayTraLoiValue = getNgayTraLoi();

            Map<String, Object> mapPredicate = new HashMap();
            mapPredicate.put(TieudeAttribute, TieuDeValue);
            mapPredicate.put(NgayguiAttribute, NgayGuiValue);
            mapPredicate.put(NgaytraloiAttribute, NgayTraLoiValue);
            mapPredicate.put(ChudeAttribute, ChudeValue);
            mapPredicate.put(EmailAttribute, EmailValue);
            Utils.search("HoidapView1Iterator", mapPredicate);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void create(ActionEvent actionEvent) {
        Utils.iteratorRefresh("HoidapView1Iterator");
        Utils.execute("CreateInsert");
        Utils.showPopup(popupThemMoi);
    }

    public void update(ActionEvent actionEvent) {
        try {
            if (Utils.getIteratorBinding("HoidapView1Iterator").getCurrentRow() ==
                null) {
                String meg = "Bạn chưa chọn câu hỏi nào.";
                Utils.showMessage(Utils.MSG_INFO, meg);
            } else {
                DCIteratorBinding iterHoidap =
                    Utils.getIteratorBinding("HoidapView1Iterator");
                iterHoidap.getCurrentRow().setAttribute("Nguoitraloi",
                                                        Utils.getCurrentUser());
                Utils.execute("Commit");
                Utils.showPopup(popupThemMoi);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void commitDialog(DialogEvent dialogEvent) {
        try {
            Date ngaygui = null;
            Date ngaytraloi = null;
            if (ValueNgaygui.getValue() != null) {
                Object obj = ValueNgaygui.getValue();
                if (obj instanceof oracle.jbo.domain.Date) {
                    ngaygui = ((oracle.jbo.domain.Date)obj).dateValue();
                } else if (obj instanceof Date) {
                    ngaygui = (Date)obj;
                }
            }
            if (NewNgaytraloi != null) {
                ngaytraloi = NewNgaytraloi;
            } else {
                if (ValueNgaytraloi.getValue() != null) {
                    Object obj = ValueNgaytraloi.getValue();
                    if (obj instanceof oracle.jbo.domain.Date) {
                        ngaytraloi = ((oracle.jbo.domain.Date)obj).dateValue();
                    } else if (obj instanceof Date) {
                        ngaytraloi = (Date)obj;
                    } else if (obj instanceof String) {
                        SimpleDateFormat formatter =
                            new SimpleDateFormat("dd/MM/yyyy");
                        ngaytraloi = formatter.parse(obj.toString());
                    }
                }
            }
            if (ngaygui != null && ngaytraloi != null &&
                ngaygui.after(ngaytraloi)) {
                String meg = "Bạn phải nhập ngày trả lời lớn hơn ngày gửi";
                Utils.showMessage(Utils.MSG_ERROR, meg);
            } else {
                DCIteratorBinding iterNoidunghoidap =
                    Utils.getIteratorBinding("HoidapView1Iterator");
                if (NewNgaytraloi != null) {
                    iterNoidunghoidap.getCurrentRow().setAttribute("NgayTraLoi",
                                                                   NewNgaytraloi.toString());
                } else {
                    iterNoidunghoidap.getCurrentRow().setAttribute("NgayTraLoi",
                                                                   ngaytraloi);
                }
                String rowKey = "";
                if (iterNoidunghoidap.getCurrentRow() != null) {
                    rowKey =
                            iterNoidunghoidap.getCurrentRow().getKey().toStringFormat(false);
                }
                Utils.execute("Commit");
                iterNoidunghoidap.setCurrentRowWithKey(rowKey);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void cancelDiaglog(PopupCanceledEvent popupCanceledEvent) {
        DCIteratorBinding iterNoidunghoidap =
            Utils.getIteratorBinding("HoidapView1Iterator");
        String rowKey = "";
        if (iterNoidunghoidap.getCurrentRow() != null) {
            rowKey =
                    iterNoidunghoidap.getCurrentRow().getKey().toStringFormat(false);
        }
        Utils.execute("Rollback");
        iterNoidunghoidap.setCurrentRowWithKey(rowKey);
    }

    public void deleteDiaglog(DialogEvent dialogEvent) {
        try {
            if (Utils.getIteratorBinding("HoidapView1Iterator").getCurrentRow() ==
                null) {
                String meg = "Không có câu hỏi nào.";
                Utils.showMessage(Utils.MSG_INFO, meg);
            } else {
                DCIteratorBinding iterNoidunghoidap =
                    Utils.getIteratorBinding("HoidapView1Iterator");
                String HoidapId =
                    iterNoidunghoidap.getCurrentRow().getAttribute("Id").toString();
                ViewObject vo = iterNoidunghoidap.getViewObject();
                vo.setAccessMode(RowSet.SCROLLABLE);
                iterNoidunghoidap.setCurrentRowWithKeyValue(HoidapId);
                Utils.execute("Delete");
                Utils.execute("Commit");
                vo.setAccessMode(RowSet.RANGE_PAGING);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //    public void deleteDiaglog(DialogEvent dialogEvent) {
    //        try {
    //            boolean succsess = false;
    //            if (Utils.getIteratorBinding("HoidapView1Iterator").getCurrentRow() ==
    //                null) {
    //                String meg = "Không có câu hỏi nào.";
    //                Utils.showMessage(Utils.MSG_INFO, meg);
    //            } else {
    //                DCIteratorBinding iterNoidunghoidap =
    //                    Utils.getIteratorBinding("HoidapView1Iterator");
    //                if (tbl.getSelectedRowKeys().size() > 0) {
    //                    for (Object facesRowKey : tbl.getSelectedRowKeys()) {
    //                        tbl.setRowKey(facesRowKey);
    //                        Object objrow = tbl.getRowData();
    //                        if (objrow == null) {
    //                            succsess = true;
    //                        } else {
    //                            JUCtrlHierNodeBinding rowData =
    //                                (JUCtrlHierNodeBinding)objrow;
    //                            Row row = rowData.getRow();
    //                            ViewRowImpl viewRow = (ViewRowImpl)row;
    //                            String key =
    //                                viewRow.getKey().toStringFormat(false);
    //                            iterNoidunghoidap.removeRowWithKey(key);
    //                        }
    //
    //                    }
    //                    if (succsess) {
    //                        String meg = "Bạn chưa chọn bản ghi nào";
    //                        Utils.showMessage(Utils.MSG_INFO, meg);
    //                    }
    //                    Utils.execute("Commit");
    //                } else {
    //                    String messg = "Bạn chưa chọn bản ghi nào";
    //                    Utils.showMessage(Utils.MSG_INFO, messg);
    //                }
    //            }
    //        } catch (Exception e) {
    //            e.printStackTrace();
    //        }
    //    }

    public void openPopupDelete(ActionEvent actionEvent) {
        if (Utils.getIteratorBinding("HoidapView1Iterator").getCurrentRow() ==
            null) {
            String messageText = "Chưa có nội dung hỏi đáp nào.";
            Utils.showMessage(Utils.MSG_INFO, messageText);
        } else {
            Utils.showPopup(popupDelete);
        }
    }

    public void setPopupThemMoi(RichPopup popupThemMoi) {
        this.popupThemMoi = popupThemMoi;
    }

    public RichPopup getPopupThemMoi() {
        return popupThemMoi;
    }


    public void setHoidapIterator(UIXIterator hoidapIterator) {
        this.hoidapIterator = hoidapIterator;
    }

    public UIXIterator getHoidapIterator() {
        return hoidapIterator;

    }


    public void setTieude(String Tieude) {
        this.Tieude = Tieude;
    }

    public String getTieude() {
        return Tieude;
    }

    public void setNgayGui(Date NgayGui) {
        this.NgayGui = NgayGui;
    }

    public Date getNgayGui() {
        return NgayGui;
    }

    public void setNgayTraLoi(Date NgayTraLoi) {
        this.NgayTraLoi = NgayTraLoi;
    }

    public Date getNgayTraLoi() {
        return NgayTraLoi;
    }

    public void setEmail(String Email) {
        this.Email = Email;
    }

    public String getEmail() {
        return Email;
    }

    public void setTbl(UIXTable tbl) {
        this.tbl = tbl;
    }

    public UIXTable getTbl() {
        return tbl;
    }

    public void setSelectChude(RichSelectOneChoice selectChude) {
        this.selectChude = selectChude;
    }

    public RichSelectOneChoice getSelectChude() {
        return selectChude;
    }

    public void setPopupXemChiTiet(RichPopup popupXemChiTiet) {
        this.popupXemChiTiet = popupXemChiTiet;
    }

    public RichPopup getPopupXemChiTiet() {
        return popupXemChiTiet;
    }

    public void setPopupDelete(RichPopup popupDelete) {
        this.popupDelete = popupDelete;
    }

    public RichPopup getPopupDelete() {
        return popupDelete;
    }

    public void setPageNumber(int pageNumber) {
        JUCtrlRangeBinding HoidapView = this.getHoiDapView();
        if (pageNumber >
            Math.max(1, (HoidapView.getIteratorBinding().getEstimatedRowCount() -
                         1) / RANGE_SIZE + 1)) {
            pageNumber =
                    (int)Math.max(1, (HoidapView.getIteratorBinding().getEstimatedRowCount() -
                                      1) / RANGE_SIZE + 1);
        }
        this.pageNumber = pageNumber;
    }

    public int getPageNumber() {
        return pageNumber =
                getHoiDapView().getIteratorBinding().getNavigatableRowIterator().getRangeStart() /
                RANGE_SIZE + 1;
    }

    public static int getRANGE_SIZE() {
        return RANGE_SIZE;
    }

    public void rowSelected(SelectionEvent se) {
        Utils.rowSelected(se, "HoidapView1");
    }

    public String goToPage() {
        Utils.goToPage(RANGE_SIZE, pageNumber, "HoidapView1");
        return null;
    }

    public String goLastPage() {
        Utils.goLastPage(RANGE_SIZE, "HoidapView1");
        return null;
    }

    public boolean isLastEnabled() {
        return Utils.isLastEnabled(RANGE_SIZE, "HoidapView1");
    }

    public boolean isFirstEnabled() {
        return Utils.isFirstEnabled(RANGE_SIZE, "HoidapView1");
    }
    
    private JUCtrlRangeBinding getHoiDapView() {
        return Utils.getViewObject("HoidapView1");
    }

    public void setValueNgaygui(RichInputDate ValueNgaygui) {
        this.ValueNgaygui = ValueNgaygui;
    }

    public RichInputDate getValueNgaygui() {
        return ValueNgaygui;
    }

    public void setValueNgaytraloi(RichInputDate ValueNgaytraloi) {
        this.ValueNgaytraloi = ValueNgaytraloi;
    }

    public RichInputDate getValueNgaytraloi() {
        return ValueNgaytraloi;
    }

    public void setNgaytraloimacdinh(String Ngaytraloimacdinh) {
        this.Ngaytraloimacdinh = Ngaytraloimacdinh;
    }

    public String getNgaytraloimacdinh() {
        Ngaytraloimacdinh = "";
        DCIteratorBinding IteratorHoidap =
            Utils.getIteratorBinding("HoidapView1Iterator");
        if (IteratorHoidap.getCurrentRow().getAttribute("NgayTraLoi") !=
            null) {
            Object ngaymacdinh =
                IteratorHoidap.getCurrentRow().getAttribute("NgayTraLoi");
            Ngaytraloimacdinh = Utils.FormatDateByObject(ngaymacdinh);
        } else {
            if (Utils.getCurrentDate().dateValue() != null) {
                Object ngayhientai = Utils.getCurrentDate().dateValue();
                Ngaytraloimacdinh = Utils.getFormatDateByObject(ngayhientai);
            }
        }
        return Ngaytraloimacdinh;
    }

    public void ValueChangeNgaytraloi(ValueChangeEvent valueChangeEvent) {
        if (valueChangeEvent.getNewValue() != null) {
            Object objngaytraloi = valueChangeEvent.getNewValue();
            if (objngaytraloi instanceof oracle.jbo.domain.Date) {
                NewNgaytraloi =
                        ((oracle.jbo.domain.Date)objngaytraloi).dateValue();
            } else if (objngaytraloi instanceof Date) {
                NewNgaytraloi = (Date)objngaytraloi;
            } else if (objngaytraloi instanceof String) {
                NewNgaytraloi = Utils.toTimeStamp(objngaytraloi.toString());
            }
        }
    }

    public void setNewNgaytraloi(Date NewNgaytraloi) {
        this.NewNgaytraloi = NewNgaytraloi;
    }

    public Date getNewNgaytraloi() {
        return NewNgaytraloi;
    }
}
